'''
https://www.nowcoder.com/practice/bf877f837467488692be703735db84e6
'''

n, bag_weight = map(int, input().split())
weights = list(map(int, input().split()))

# 暴力搜索 [i~size), 将重量不超过bag_weight的选择方法产生的重量放到ans中
def f(i, size, cur_weight, ans):
    if cur_weight > bag_weight:
        return
    if i == size:
        ans.append(cur_weight)
        return
    f(i + 1, size, cur_weight, ans)
    f(i + 1, size, cur_weight + weights[i], ans)

left_ans = []
right_ans = []
f(0, n // 2, 0, left_ans)
f(n // 2, n, 0, right_ans)
# 统计左右左侧的ans，不超过bag_weight, 的情况有多少种组合
left_ans.sort()
right_ans.sort()
m, n = len(left_ans), len(right_ans)
l, r = 0, n - 1
ans = 0
while l < m:
    while r >= 0 and left_ans[l] + right_ans[r] > bag_weight:
        r -= 1
    ans += r + 1
    l += 1

print(ans)


